package 简单.双指针;

/**
 * 给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。
 * 请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0 <= l <= r < nums.length) 且满足以下条件的 最长子数组 ：
 * nums[l] % 2 == 0
 * 对于范围 [l, r - 1] 内的所有下标 i ，nums[i] % 2 != nums[i + 1] % 2
 * 对于范围 [l, r] 内的所有下标 i ，nums[i] <= threshold
 * 以整数形式返回满足题目要求的最长子数组的长度。
 * 注意：子数组 是数组中的一个连续非空元素序列
 *
 * @ https://leetcode.cn/problems/longest-even-odd-subarray-with-threshold/description/
 * @date 2024/07/09
 */
public class 最长奇偶子数组_2760 {

    public static void main(String[] args) {

    }

    /**
     * 分组循环
     * 适用场景：按照题目要求，数组会被分割成若干组，且每一组的判断/处理逻辑是一样的。
     * 核心思想：
     * 外层循环负责遍历组之前的准备工作（记录开始位置），和遍历组之后的统计工作（更新答案最大值）。
     * 内层循环负责遍历组，找出这一组最远在哪结束
     */
    public int longestAlternatingSubarray(int[] nums, int threshold) {
        int ans = 0;
        int left = 0;

        while (left < nums.length) {
            if (nums[left] % 2 != 0 || nums[left] > threshold) {
                left++;
                continue;
            }

            int right = left + 1;
            while (right < nums.length && nums[right] <= threshold &&
                    nums[right] % 2 != nums[right - 1] % 2) {
                right++;
            }

            ans = Math.max(ans, right - left);

            left = right;
        }

        return ans;
    }

}
